﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
/*
======================================================================================================
描述
给定一个长度为n的数组nums，请你找到峰值并返回其索引。数组可能包含多个峰值，在这种情况下，返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
2.假设 nums[-1] = nums[n] =
−
∞
−∞
3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
4.你可以使用O(logN)的时间复杂度实现此问题吗？

===============================================================================================
*/
int findPeakElement(int* nums, int numsLen) 
{
    //由于峰值的左右两边必定是上坡和下坡，而数组左边界上坡，右边界下坡，所以我们可以用二分法压缩边界
    // write code here
    int left = 0;
    int right = numsLen - 1;
    while (left < right) //不能相等，不然下面可能越界,并且相等即说明到达峰值
    {
        int mid = (right - left) / 2 + left;
        if (nums[mid] < nums[mid + 1]) //处于上坡
        {
            left = mid + 1; //压缩
        }
        else //处于下坡
        {
            right = mid;
        }
    }
    return left;
}